package leetcode.string;

/*
 6. Z 字形变换

 将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING"?行数为 3 时，排列如下：

L   C   I   R
E T O E S I I G
E   D   H   N

之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数：
string convert(string s, int numRows);

示例1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例2:
输入: s = "LEETCODEISHIRING", numRows =?4
输出:?"LDREOEIIECIHNTSG"
解释:
L     D     R
E   O E   I I
E C   I H   N
T     S     G
*/

public class Convert6 {

    public static void main(String[] args) {

        String s = "LEETCODEISHIRING";
        int numRows = 3;

        System.out.println(test(s, numRows));
    }

    public static String test(String s, int numRows) {

        return settle1(s, numRows);
    }

    // 数组加StringBuilder助攻
    private static String settle1(String s, int numRows) {
        System.out.println("s: " + s + " numRows: " + numRows);

        if(null == s || 0 == numRows)
            return null;
        if(2 >= s.length() || 1 == numRows)
            return s;

        int rows = Math.min(numRows, s.length());
        StringBuilder[] sbs = new StringBuilder[rows];

        for(int i = 0; i < rows; i++) {
            sbs[i] = new StringBuilder();
        }

        int direction = -1;  // 0表示向下，1表示向上

        char[] ca = s.toCharArray();
        int rowIndex = 0;
        for(int i = 0; i < s.length(); i++) {
            sbs[rowIndex].append(ca[i]);

            if(0 == rowIndex || (rowIndex + 1) == numRows) {
                direction = -direction;
            }

            rowIndex = rowIndex + direction;
        }

        StringBuilder   sb = new StringBuilder();
        for(int i = 0; i < rows; i++)
            sb.append(sbs[i].toString());

        return sb.toString();
    }

    // 用二维数组肝，核心问题是计算二维数组的列数
    private static String settle2(String s, int numRows) {
        System.out.println("s: " + s + " numRows: " + numRows);

        if(null == s || 0 == numRows)
            return null;
        if(2 >= s.length() || 1 == numRows)
            return s;

        // 计算二维数组列数

        return null;
    }
}
